package com.csyf.manager.utils;

import java.math.BigDecimal;
import java.util.Random;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 此方法为了处理数字间的基本运算<p></p>主要涵盖:<br>
 * 所有相加<br>
 * 两数相减<br>
 * 所有乘法<br>
 * 两数相除<br>
 * 两数取魔<br>
 * 将元转成分<br>
 * 将分转成元<br>
 * Created by ENZO on 2017/9/30.
 */
public class NumberHelpler {


    /**
     * 所有数相加
     *
     * @param params
     * @return
     */
    public static BigDecimal add(Object... params) {
        BigDecimal result = BigDecimal.ZERO;
        for (Object param : params) {
            BigDecimal value = parseBigDecimal(param);
            result = result.add(value);
        }
        return result;
    }


    /**
     * 两个数相减 {@param1} - {@param2}
     *
     * @param param1
     * @param parma2
     * @return
     */
    public static BigDecimal subtract(Object param1, Object parma2) {
        BigDecimal bignumber = parseBigDecimal(param1);
        BigDecimal smailer = parseBigDecimal(parma2);
        return bignumber.subtract(smailer);
    }

    /**
     * 所有数相乘
     *
     * @param params
     * @return
     */
    public static BigDecimal multiply(Object... params) {
        BigDecimal result = null;
        for (Object param : params) {
            BigDecimal value = parseBigDecimal(param);
            if (null == result) {
                result = value;
                continue;
            }
            result = result.multiply(value);
        }
        return result;

    }

    /**
     * 两个数相除  param1÷ param2
     *
     * @param param1
     * @param parma2
     * @return
     */
    public static BigDecimal divide(Object param1, Object parma2) {
        BigDecimal bignumber = parseBigDecimal(param1);
        BigDecimal smailer = parseBigDecimal(parma2);
        return bignumber.divide(smailer);
    }


    /**
     * 两个数求魔   eq: 10%3 = 1
     *
     * @param param1
     * @param param2
     * @return
     */
    public static BigDecimal mod(Object param1, Object param2) {
        BigDecimal bigDecimal = parseBigDecimal(param1);
        BigDecimal bigDecimal1 = parseBigDecimal(param2);
        BigDecimal[] bigDecimals = bigDecimal.divideAndRemainder(bigDecimal1);
        return bigDecimals[1];
    }

    public static boolean isNumber(String value) { // 检查是否是数字
        String patternStr = "^[0-9]+(.[0-9]{1,10})?$";
        Pattern p = Pattern.compile(patternStr, Pattern.CASE_INSENSITIVE); // 忽略大小写;
        Matcher m = p.matcher(value);
        return m.find();
    }

    /**
     * 将元转成分
     *
     * @param money 金额（元）
     * @return
     */
    public static Integer money2cent(Object money) {
        return multiply(money, 100).intValue();
    }
    

    /**
     * 将金额分转为 元
     * @param money 金额（分）
     * @return
     */
    public static BigDecimal cent2money(Object money){
    	return parseBigDecimal(money).divide(BigDecimal.TEN).divide(BigDecimal.TEN).setScale(2,BigDecimal.ROUND_HALF_UP);
    }

    //public static void main(String[] args) {
        //System.out.println(cent2money("10").toString());
    //}


	/**
	 * 类型转化器    Object -->  BigDecimal
	 *
	 * @param param
	 * @return
	 */
	private static BigDecimal parseBigDecimal(Object param) {
	    if (null == param) {
	        throw new IllegalArgumentException("param is null ...");
	    }
	    BigDecimal value;
	    if (param instanceof String) {
	        String s = String.valueOf(param);
	        if (!isNumber(s)) {
                throw new IllegalArgumentException(param + " is not a number ...");
            }
	        value = new BigDecimal(s);
	    } else if (param instanceof Long) {
	        value = new BigDecimal((Long) param);
	    } else if (param instanceof Double) {
	        value = new BigDecimal(String.valueOf(param));
	    } else if (param instanceof Integer) {
	        value = new BigDecimal((Integer) param);
	    } else if (param instanceof Float) {
	        value = new BigDecimal((Float) param);
	    } else if (param instanceof BigDecimal) {
	        value = (BigDecimal)param;
	    } else {
	        throw new IllegalArgumentException("param type is error ...");
	    }
	    return value;
	}

    /**
     * 获取某个范围内的随机数
     * @param min
     * @param max
     * @return
     */
	public static int randomRange(int min, int max) {
        Random random = new Random();
        int result = random.nextInt(max)%(max-min+1) + min;
        return result;
    }

    /**
     * 生成固定长度的随机数
     * @param strLength
     */
    public static String getFixLenRandom(int strLength) {
        Random rm = new Random();

        // 获得随机数
        double pross = (1 + rm.nextDouble()) * Math.pow(10, strLength);

        // 将获得的获得随机数转化为字符串
        String fixLenthString = String.valueOf(pross);

        // 返回固定的长度的随机数
        return fixLenthString.substring(1, strLength + 1);
    }


    public static void main(String[] args) {
        for(int i=0;i<50;i++) {
            System.out.println(randomRange(1000,2000));
        }

    }
}